<?php

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of Acl
 *
 * @author Богдан
 */
class Application_Plugin_Acl extends Zend_Controller_Plugin_Abstract {
    public function __construct() {
        $this->acl = new Zend_Acl();
        //создание ролей
        $this->acl->addRole(new Zend_Acl_Role('guest'));
        $this->acl->addRole(new Zend_Acl_Role('admin'));
        //создание ресурсов
        //$this->acl->add(new Zend_Acl_Resource('admin:index'));        
        $this->acl->add(new Zend_Acl_Resource('default:login'));
        $this->acl->add(new Zend_Acl_Resource('default:index'));
        //доступ к ресурсам        
        $this->acl->allow('admin', null);        
        $this->acl->allow('guest', 'default:login');
        $this->acl->allow('guest', 'default:index');
        //$this->acl->allow('guest', 'admin:index');
        Zend_Registry::set('acl', $this->acl);
    }
    
    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {
        $auth = Zend_Auth::getInstance();        
        $acl = Zend_Registry::get('acl');        
        // проверяем если юзер вошел в систему и имеет правильный тип,
        // иначе, назначаем ему тип по умолчанию ("guest")
        if ($auth->hasIdentity())
            $role = $auth->getIdentity()->role;
        else
            $role = 'guest';

        if (!$acl->hasRole($role))
            $role = 'guest';

        // ACL resource - запрошенный модуль:контроллер
        $resource = $request->module. ':'. $request->controller;

        // ACL privilege  - запрошенное действие
        $privilege = $request->action;

        // если не имеем конкретно добавленного ресурса, проверяем
        // привилегии по умолчанию
        if (!$acl->has($resource))
            $resource = null;

        // доступ запрещен - перенаправляем запрос на страницу входа
        if (!$acl->isAllowed($role, $resource, $privilege)) {             
            $request->setModuleName('');
            $request->setControllerName('index');
            $request->setActionName('index');
        }
    }    
}

?>
